package com.pap.ribbonlb.nacos;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import org.springframework.cloud.alibaba.nacos.ribbon.NacosServer;

import java.util.List;

public class PapSimplePortRule extends AbstractLoadBalancerRule {

    /**
     * 在choose方法中，自定义我们自己的规则，返回的Server就是具体选择出来的服务
     * 自己的规则：按照轮询的规则，但是每个被轮询到的服务调用5次。
     *
     * @param o
     * @return
     */
    @Override
    public Server choose(Object o) {
        // 获取负载均衡器lb
        ILoadBalancer lb = getLoadBalancer();
        if (lb == null) {
            return null;
        }

        Server server = null;
        String toSpringApplicationName = null;
        String toSpringApplicationVersion = null;
        if(lb instanceof com.netflix.loadbalancer.BaseLoadBalancer) {
            com.netflix.loadbalancer.BaseLoadBalancer baseLoadBalancer = (com.netflix.loadbalancer.BaseLoadBalancer)lb;
            toSpringApplicationName = baseLoadBalancer.getName();
            toSpringApplicationVersion = baseLoadBalancer.getClientConfig().getProperties().get(toSpringApplicationName + "-version").toString();
        }

        // 获取可用服务列表
        List<Server> upList = lb.getReachableServers();
        if(upList != null && upList.size() > 0) {
            for(Server serverTemp : upList) {
                if(serverTemp.getMetaInfo() instanceof NacosServer.MetaInfo) {
                    NacosServer.MetaInfo serverTempMetaInfo = (NacosServer.MetaInfo)serverTemp.getMetaInfo();
                    System.out.println(serverTempMetaInfo);
                }
                System.out.println(serverTemp.toString());
            }
            // 这里返回第一个。
            return upList.get(0);
        }


        return server;
    }

    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {
    }
}
